/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_vs.h
 * @brief 定义Vendor Specific相关接口
 */

#ifndef _NFA_VS_H_
#define _NFA_VS_H_

#include "nci_feature.h"
#if IS_FEATURE_ON(NCI_FEATURE_VS)

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nfa_base.h"
#include "nfa_utils.h"

#define VS_TLV_OFFSET 4
#define VS_REG_MASK 0xF0
#define VS_REG 0xA0

#if IS_FEATURE_ON(NCI_FEATURE_VS)
#define PROPRIETARY_DEBUG_L1_MASK 0x01
#define PROPRIETARY_DEBUG_L2_MASK 0x02
#define PROPRIETARY_DEBUG_L3_MASK 0x04

/**
 * @brief VS通知外部的事件通知
 */
typedef enum {
    NCI_VS_EVT_EE_ACTION_INFO = 0x00,
    NCI_VS_EVT_PROPRIETARY_LXDEBUG,
    NCI_VS_EVT_PROPRIETARY_M1_AUTH_STATUS,

    NCI_VS_EVT_MAX
} tNCI_VS_EVT;
#endif /* IS_FEATURE_ON(NCI_FEATURE_VS) */

/**
 * @brief VS模块发送指令时RF状态切换规则
 */
typedef enum {
    /** @brief 只允许IDLE状态发送, 其他状态返回失败 */
    VS_RFST_RULE_ONLY_IDLE = 0,
    /** @brief 允许IDLE/DISCOVERY状态发送, 发送前RF应为IDLE */
    VS_RFST_RULE_DISC_TO_IDLE,
    /** @brief 允许IDLE/DISCOVERY状态发送, 忽略RF状态改变 */
    VS_RFST_RULE_ALLOW_IDLE_DISC,
    /** @brief 允许所有状态发送, 忽略RF状态改变 */
    VS_RFST_RULE_ALLOW_ALL
} tNCI_VS_RFST_RULE;
/**
 * @brief 对外提供的tNCI_VS_CMD结构体
 */
typedef struct {
    /** @brief 数据长度 */
    uint16_t len;
    /** @brief 数据指针 */
    const uint8_t *data;
} tNCI_VS_CMD;

#if IS_FEATURE_ON(NCI_FEATURE_VS)
/**
 * @brief 信息上报的tNCI_VS_INFO结构体
 */
typedef struct {
    /** @brief 操作命令ID */
    uint8_t oid;
    /** @brief vs模块对外数据信息 */
    tNCI_VS_CMD msg;
} tNCI_VS_INFO;

/**
 * @brief VS通知外部事件所携带的信息和数据
 */
typedef union {
    /** @brief NFCEE活动信息 */
    tNCI_VS_CMD ee_action;
    /** @brief vs模块上报信息 */
    tNCI_VS_INFO op_info;
} tNCI_VS_CONTENT;

/**
 * @brief 外部注册给VS的回调，用于接收VS模块发送的通知
 */
typedef void (*tNCI_VS_CBACK)(tNCI_VS_EVT event, tNCI_VS_CONTENT *p_content);
#endif /* IS_FEATURE_ON(NCI_FEATURE_VS) */

/**
 * @brief 发送vendor special指令的接口函数
 * @param[in] cmd 需要发送的tNCI_VS_CMD数组
 * @param[in] num_of_cmd tNCI_VS_CMD数组长度
 * @param[out] rsp 接收最后一条指令的rsp数据
 * @param[in] stop_when_failed 发送指令失败时是否停止
 * @param[in] rf_rule 发送指令时RF状态切换规则
 * @return 发送成功返回NCI_STATUS_OK, 其他 发送失败
 */
tNCI_STATUS nfa_vs_send_cmd (tNCI_VS_CMD *cmd, uint8_t num_of_cmd,
            tNCI_RSP *rsp, bool stop_when_failed, tNCI_VS_RFST_RULE rf_rule);

/**
 * @brief 设置LxDebug级别
 * @param[in] level lxdebug级别
 */
void nfa_vs_proprietary_set_lxdebug(uint8_t level);

/**
 * @brief 设置Observe Mode状态
 *
 * @param enable true: 开启Observe Mode, false: 关闭Observe Mode
 * @return 设置成功返回NCI_STATUS_OK, 其他 设置失败
 */
tNCI_STATUS nfa_vs_set_observe_mode(bool enable);
/**
 * @brief 获取Observe Mode状态
 *
 * @return true: Observe Mode开启, false: Observe Mode关闭
 */
bool nfa_vs_is_observe_mode_enabled();
/**
 * @brief 设置Power Saving Mode状态
 *
 * @param mode true: 开启Power Saving Mode, false: 关闭Power Saving Mode
 * @return 设置成功返回NCI_STATUS_OK, 其他 设置失败
 */
tNCI_STATUS nfa_vs_set_power_saving_mode(bool mode);
/**
 * @brief 发送原始的Vendor Specific命令
 *
 * @param[in] mt 消息类型
 * @param[in] gid CMD组ID
 * @param[in] oid CMD操作ID
 * @param[in] p_payload CMD数据
 * @param[in] payload_len CMD数据长度
 * @param[out] p_rsp 接收rsp数据
 *
 * @note p_rsp需要调用者调用nfa_utils_free_rsp函数释放
 *
 * @return 发送成功返回NCI_STATUS_OK, 其他 发送失败
 */
tNCI_STATUS nfa_vs_send_raw_vendor_cmd(int mt, int gid, int oid, uint8_t *p_payload, uint16_t payload_len, tNCI_RSP *p_rsp);
/**
 * @brief 获取Vendor Specific的私有能力
 *
 * @param[out] p_rsp 接收rsp数据
 *
 * @note p_rsp需要调用者调用nfa_utils_free_rsp函数释放
 *
 * @return 获取成功返回NCI_STATUS_OK, 其他 获取失败
 */
tNCI_STATUS nfa_vs_get_proprietary_caps(tNCI_RSP *p_rsp);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* IS_FEATURE_ON(NCI_FEATURE_VS) */
#endif /* _NFA_VS_H_ */
